/**
 * @description account 服务层
 * @author LI
 */

const { Account, AccessRecord, RechargeRecord } = require('../db/model/index')
const Op = require('sequelize').Op
const { formatMoreTime, formatMoreDuring } = require('../utils/dateTime')
const doCrypto = require('../utils/cryp')

/**
 * 获取账号信息
 * @param {string} account 账号
 * @param {string} [pwd] 密码
 */
async function getAccountInfo(account, pwd) {
  // 查询条件
  const whereOpt = {
    account
  }
  if (pwd) {
    Object.assign(whereOpt, { pwd })
  }

  // 查询
  const result = await Account.findOne({
      where: whereOpt
  })
  if (result == null) {
      // 未找到
      return result
  }

  // 格式化
  // const formatRes = formatMoreTime(result.dataValues)

  return result.dataValues
}

/**
 * 创建账号
 * @param {string} account 账号
 * @param {string} pwd 密码
 * @param {number} name 姓名
 * @param {string} typecode 账号类型
 * @param {string} typeLevel 二级类型
 * @param {string} remark 备注/要求
 */
async function createAccount({ account, pwd, name, typecode, typeLevel, remark }) {
  const result = await Account.create({
    account,
    pwd: doCrypto(pwd),
    name,
    typecode,
    typeLevel,
    remark
  })

  return result
}

/**
 * 获取全部账号信息
 * @param {string} name 姓名
 * @param {number} page 第几页
 * @param {number} limit 多少条
 * @param {number} typecode 账号类型
 * @param {string} typeLevel 二级账号类型
 */
async function getAccountList({ name = '', page = 1, limit = 10, typecode, typeLevel }) {
  let whereOpt = {}
  if (typecode) {
    whereOpt = {
      typecode,
      name: {
        [Op.like]: '%' + name + '%'
      }
    }
    if (typecode === 6) {
      whereOpt = {
        typeLevel: {
          [Op.like]: '%' + typeLevel + '%'
        }
      }
    }
  } else {
    whereOpt = {
      name: {
        [Op.like]: '%' + name + '%'
      }
    }
  }
  const result = await Account.findAndCountAll({
    limit: limit, // 每页多少条
    offset: limit * (page - 1), // 跳过多少条
    where: whereOpt
  })
  result.rows.map(item => {
    // 格式化时间 多个
    item.dataValues = formatMoreTime(item.dataValues)
  })

  return result
}

/**
 * 获取链接用户扣款记录
 * @param {number} id 链接用户 id
 * @param {number} page 第几页
 * @param {number} limit 多少条
 */
async function getDeductionRecordList({ linkUserId, page, limit }) {
  const result = await AccessRecord.findAndCountAll({
    limit: limit, // 每页多少条
    offset: limit * (page - 1), // 跳过多少条
    where: { linkUserId }
  })
  result.rows.map(item => {
    // 格式化时间 多个
    item.dataValues = formatMoreDuring(item.dataValues)
  })

  return result
}

/**
 * 通过 id 更新/重置密码
 * @param {number} id id
 * @param {string} pwd 密码
 */
async function updatePwdById({ id, pwd }) {
  const result = await Account.update({ pwd }, {
    where: {
      id
    }
  })

  return result[0] > 0
}

/**
 * 通过 id 更新/账号信息
 * @param {number} id id
 * @param {string} name 店铺名称
 * @param {string} companyAddress 店铺网址
 * @param {number} adPrice 单次扣款价格
 * @param {number} balance 余额
 */
async function updateLinkUserById({ id, name, companyAddress, adPrice, balance }) {
  // 拼接查询条件
  const whereData = {}
  if (name) {
    whereData.name = name
  }
  if (companyAddress) {
    whereData.companyAddress = companyAddress
  }
  if (adPrice) {
    whereData.adPrice = adPrice
  }
  if (balance) {
    whereData.balance = balance
  }
  const result = await Account.update(whereData, {
    where: {
      id
    }
  })

  return result[0] > 0
}

/**
 * 通过 id 删除账号
 * @param {number} id id
 */
async function deleteAccountById(id) {
  const Accounts = await Account.findAll({
    where: { id },
    include: [
      { model: AccessRecord },
      { model: RechargeRecord }
    ],
  })
  for (const account of Accounts) {
    for (const child of account.accessRecords) {
      await child.destroy()
    }
    for (const child1 of account.rechargeRecords) {
      await child1.destroy()
    }
    await account.destroy()
  }

  return true
}

module.exports = {
  getAccountInfo,
  createAccount,
  getAccountList,
  updatePwdById,
  deleteAccountById,
  updateLinkUserById,
  getDeductionRecordList
}
